﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmValeDevolucion : Form
    {
        public eValeTipo Tipo { get; set; }

        public PartnerDTO Partner { get; set; }
        public OrdenProduccionDTO Op { get; set; }
        public ValeConsumoDevolucionDTO Vale { get; set; }
        public DataTable items = new DataTable();

        public frmValeDevolucion()
        {
            InitializeComponent();
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Vale vale = new Vale();
                vale.Partner = Partner;
                vale.ValeConsumoDevolucion = FillHeader();
                vale.Items = FillItems();

                if (Validar(vale))
                {
                    vale = Business.Stock.SaveDevolucion(vale);

                    FormsHelper.MsgGuardadoOk();

                    this.Close();
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private bool Validar(Vale vale)
        {
            errP.Clear();

            if (vale.ValeConsumoDevolucion.IdOrdenProduccion == 0)
            {
                errP.SetError(btGuardar, "Se debe seleccionar una Orden de Produccion.");
                return false;
            }
            if (vale.Items.Count == 0)
            {
                errP.SetError(btGuardar, "Se deben ingresar Items al vale.");
                return false;
            }

            foreach (var item in vale.Items)
            {
                if (item.Cantidad == 0)
                {
                    errP.SetError(btGuardar, "Se debe ingresar 'Cantidad' para todos los Items.");
                    return false;
                }

                if (item.NroAnalisis.Trim() == string.Empty)
                {
                    errP.SetError(btGuardar, "Se debe ingresar 'NroAnalisis' para todos los Items.");
                    return false;
                }
            }

            return true;
        }

        private void btOp_Click(object sender, EventArgs e)
        {
            ShowSeleccionarOP();
        }

        private void ShowSeleccionarOP()
        {
            using (frmOPSeleccion f = new frmOPSeleccion())
            {
                f.Partner = null;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    CleanControls();

                    this.Op = f.OP;
                    this.Partner = Partners.Get(this.Op.IdPartner);
                    LoadOP();

                    grpOp.Enabled = true;
                    grpItems.Enabled = true;
                    btGuardar.Enabled = true;
                    txObs.ReadOnly = false;
                    txObsImpresion.ReadOnly = false;
                }
            }
        }

        private void frmValeDevolucion_Load(object sender, EventArgs e)
        {
            cbTipoIngreso.Items.Add(eValeTipo.CONSUMO.ToString());
            cbTipoIngreso.Items.Add(eValeTipo.DEVOLUCION.ToString());
            cbTipoIngreso.SelectedIndex = 1;

            items = new DataTable();
            items.Columns.Add("IdProducto", typeof(int));
            items.Columns.Add("Producto");
            items.Columns.Add("NroAnalisis");
            items.Columns.Add("Cantidad", typeof(decimal));
            items.Columns.Add("IdStock", typeof(int));
            items.Columns.Add("Estado", typeof(string));
            items.Columns.Add("Observaciones");
            items.AcceptChanges();

            FillGrid();

            btGuardar.Enabled = false;
        }

        private void CleanControls()
        {
            this.items.Rows.Clear();
        }

        private void LoadOP()
        {
            txNumeroOP.Text = Op.ToString();
            txProducto.Text = Productos.Get(Op.IdProducto).ToString();
            txPartner.Text = Partner.ToString();
        }

        private void FillGrid()
        {
            gvItems.DataSource = null;
            gvItems.DataSource = items;
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("¿Está seguro de que desea quitar el item seleccionado?",
                    "Quitar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    items.Rows.Remove(
                        ((DataRowView)gvItems.SelectedRows[0].DataBoundItem).Row);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            Modificar();
        }

        private void Modificar()
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                using (frmValeItemDevolucion f = new frmValeItemDevolucion())
                {
                    f.Partner = Partner;
                    f.Producto = Productos.Get((int)gvItems.SelectedRows[0].Cells["IdProducto"].Value);
                    f.Cantidad = (decimal)gvItems.SelectedRows[0].Cells["Cantidad"].Value;
                    f.NroAnalisis = (string)gvItems.SelectedRows[0].Cells["NroAnalisis"].Value;
                    f.Observaciones = (string)gvItems.SelectedRows[0].Cells["Observaciones"].Value;
                    f.Estado = (string)gvItems.SelectedRows[0].Cells["Estado"].Value;

                    FormsHelper.CargarColumnasGrilla(f);
                    if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        gvItems.SelectedRows[0].Cells["IdProducto"].Value = f.Producto.Id;
                        gvItems.SelectedRows[0].Cells["Producto"].Value = f.Producto.Nombre;
                        gvItems.SelectedRows[0].Cells["Cantidad"].Value = f.Cantidad;
                        gvItems.SelectedRows[0].Cells["NroAnalisis"].Value = f.NroAnalisis;
                        gvItems.SelectedRows[0].Cells["Observaciones"].Value = f.Observaciones;
                        gvItems.SelectedRows[0].Cells["Estado"].Value = f.Estado;
                    }
                }
            }
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmValeItemDevolucion f = new frmValeItemDevolucion())
            {
                //Sugiero el Lote como NroAnalisis.
                f.NroAnalisis = Op.NumeroLote; 
                f.Partner = this.Partner;

                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    items.Rows.Add(
                        f.Producto.Id,
                        f.Producto.Nombre,
                        f.NroAnalisis,
                        f.Cantidad,
                        DBNull.Value,
                        f.Estado,
                        f.Observaciones);

                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void cbTipoIngreso_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbTipoIngreso.SelectedIndex == 0)
            {
                this.Text = "Vale de Consumo";
                Tipo = eValeTipo.CONSUMO;
            }
            else
            {
                this.Text = "Vale de Devolución";
                Tipo = eValeTipo.DEVOLUCION;
            }
        }

        private ValeConsumoDevolucionDTO FillHeader()
        {
            ValeConsumoDevolucionDTO ir = new ValeConsumoDevolucionDTO();

            ir.Activo = true;
            ir.Tipo = this.Tipo.ToString().ToUpper();
            ir.Fecha = dt.Value;
            ir.IdOrdenProduccion = this.Op.Id;

            //
            if (txLetra.Text.Trim() != string.Empty)
                ir.Letra = txLetra.Text.Trim().Substring(0, 1);
            else
                ir.Letra = " ";

            ir.Numero = Convert.ToInt32(nuNumero.Value);
            ir.PtoVta = Convert.ToInt32(nuPtoVta.Value);
            ir.NroComprobante = string.Format("{0}{1}{2}", ir.Letra, ir.PtoVta, ir.Numero);
            //

            ir.Obs = txObs.Text;
            ir.ObsImpresion = txObsImpresion.Text;

            return ir;
        }

        private List<ValeConsumoDevolucionItemDTO> FillItems()
        {
            ValeConsumoDevolucionItemDTO item;
            List<ValeConsumoDevolucionItemDTO> itemsList = new List<ValeConsumoDevolucionItemDTO>();

            foreach (DataRow row in items.Rows)
            {
                item = new ValeConsumoDevolucionItemDTO();

                item.Activo = true;
                item.Cantidad = (decimal)row["Cantidad"];
                item.Obs = (string)row["Observaciones"];
                //item.IdStock = (int)row["IdStock"];
                item.IdProducto = (int)row["IdProducto"];
                item.NroAnalisis = (string)row["NroAnalisis"];
                item.Estado = (string)row["Estado"];

                itemsList.Add(item);
            }

            return itemsList;
        }

        internal void SetValues(int id)
        {
            try
            {
                this.Vale = Business.Stock.GetVale(id);
                this.items = Business.Stock.GetValeItemsTable(id);
                this.Op = Business.OrdenesProduccion.GetOp(Vale.IdOrdenProduccion);
                this.Partner = Business.Partners.Get(Op.IdPartner);

                if (Vale.Tipo.ToUpper().Trim() == eValeTipo.CONSUMO.ToString().ToUpper())
                    this.Tipo = eValeTipo.CONSUMO;
                else
                    this.Tipo = eValeTipo.DEVOLUCION;

                cbTipoIngreso.SelectedIndex = cbTipoIngreso.FindString(Vale.Tipo.ToUpper());
                txNumeroOP.Text = Op.ToString();
                txProducto.Text = Productos.Get(Op.IdProducto).ToString();

                dt.Value = Vale.Fecha;
                txLetra.Text = Vale.Letra;
                nuPtoVta.Value = Vale.PtoVta;
                nuNumero.Value = Vale.Numero;

                tblItems.Enabled = false;

                txObs.Text = Vale.Obs;
                txObsImpresion.Text = Vale.ObsImpresion;

                FillGrid();
                btGuardar.Enabled = false;

            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btValeConsumo_Click(object sender, EventArgs e)
        {
            using (frmValeConsumoSeleccion f = new frmValeConsumoSeleccion())
            {
                f.Op = this.Op;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    DataTable dtItems = Stock.GetValeItemsTable(f.Vale.Id);

                    foreach (DataRow consumoItem in dtItems.Rows)
                    {
                        items.Rows.Add(
                            consumoItem["IdProducto"],
                            consumoItem["Producto"],
                            Op.NumeroLote, //f.NroAnalisis,
                            0, //f.Cantidad,
                            DBNull.Value,
                            string.Empty, //Estado
                            string.Empty); // f.Observaciones);
                    }
                    
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void picProducto_Click(object sender, EventArgs e)
        {
            if (Op != null)
            {
                using (frmProductoDetalle f = new frmProductoDetalle())
                {
                    f.Producto = Productos.Get(Op.IdProducto);
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
        }

        private void picPartnerDetalle_Click(object sender, EventArgs e)
        {
            if (this.Partner != null)
            {
                using (frmPartnerDetalle f = new frmPartnerDetalle())
                {
                    f.Partner = this.Partner;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Partner para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void gvItems_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            Modificar();
        }
    }
}
